home *** CD-ROM | disk | FTP | other *** search
/ Software of the Month Club 2000 October / Software of the Month - Ultimate Collection Shareware 277.iso / pc / PROGRAMS / UTILITY / WINLINUX / DATA1.CAB / programs_-_include / ASM-ARM / ARCH-RPC / IRQ.H < prev    next >
C/C++ Source or Header  |  1999-09-17  |  4KB  |  175 lines

  1. /*
  2.  * include/asm-arm/arch-rpc/irq.h
  3.  *
  4.  * Copyright (C) 1996 Russell King
  5.  *
  6.  * Changelog:
  7.  *   10-10-1996    RMK    Brought up to date with arch-sa110eval
  8.  *   22-08-1998    RMK    Restructured IRQ routines
  9.  */
  10.  
  11. static void rpc_mask_irq_ack_a(unsigned int irq)
  12. {
  13.     unsigned int temp;
  14.  
  15.     __asm__ __volatile__(
  16.     "ldrb    %0, [%2]\n"
  17. "    bic    %0, %0, %1\n"
  18. "    strb    %0, [%2]\n"
  19. "    strb    %1, [%3]"
  20.     : "=&r" (temp)
  21.     : "r" (1 << (irq & 7)), "r" (ioaddr(IOMD_IRQMASKA)),
  22.       "r" (ioaddr(IOMD_IRQCLRA)));
  23. }
  24.  
  25. static void rpc_mask_irq_a(unsigned int irq)
  26. {
  27.     unsigned int temp;
  28.  
  29.     __asm__ __volatile__(
  30.     "ldrb    %0, [%2]\n"
  31. "    bic    %0, %0, %1\n"
  32. "    strb    %0, [%2]"
  33.     : "=&r" (temp)
  34.     : "r" (1 << (irq & 7)), "r" (ioaddr(IOMD_IRQMASKA)));
  35. }
  36.  
  37. static void rpc_unmask_irq_a(unsigned int irq)
  38. {
  39.     unsigned int temp;
  40.  
  41.     __asm__ __volatile__(
  42.     "ldrb    %0, [%2]\n"
  43. "    orr    %0, %0, %1\n"
  44. "    strb    %0, [%2]"
  45.     : "=&r" (temp)
  46.     : "r" (1 << (irq & 7)), "r" (ioaddr(IOMD_IRQMASKA)));
  47. }
  48.  
  49. static void rpc_mask_irq_b(unsigned int irq)
  50. {
  51.     unsigned int temp;
  52.  
  53.     __asm__ __volatile__(
  54.     "ldrb    %0, [%2]\n"
  55. "    bic    %0, %0, %1\n"
  56. "    strb    %0, [%2]"
  57.     : "=&r" (temp)
  58.     : "r" (1 << (irq & 7)), "r" (ioaddr(IOMD_IRQMASKB)));
  59. }
  60.  
  61. static void rpc_unmask_irq_b(unsigned int irq)
  62. {
  63.     unsigned int temp;
  64.  
  65.     __asm__ __volatile__(
  66.     "ldrb    %0, [%2]\n"
  67. "    orr    %0, %0, %1\n"
  68. "    strb    %0, [%2]"
  69.     : "=&r" (temp)
  70.     : "r" (1 << (irq & 7)), "r" (ioaddr(IOMD_IRQMASKB)));
  71. }
  72.  
  73. static void rpc_mask_irq_dma(unsigned int irq)
  74. {
  75.     unsigned int temp;
  76.  
  77.     __asm__ __volatile__(
  78.     "ldrb    %0, [%2]\n"
  79. "    bic    %0, %0, %1\n"
  80. "    strb    %0, [%2]"
  81.     : "=&r" (temp)
  82.     : "r" (1 << (irq & 7)), "r" (ioaddr(IOMD_DMAMASK)));
  83. }
  84.  
  85. static void rpc_unmask_irq_dma(unsigned int irq)
  86. {
  87.     unsigned int temp;
  88.  
  89.     __asm__ __volatile__(
  90.     "ldrb    %0, [%2]\n"
  91. "    orr    %0, %0, %1\n"
  92. "    strb    %0, [%2]"
  93.     : "=&r" (temp)
  94.     : "r" (1 << (irq & 7)), "r" (ioaddr(IOMD_DMAMASK)));
  95. }
  96.  
  97. static void rpc_mask_irq_fiq(unsigned int irq)
  98. {
  99.     unsigned int temp;
  100.  
  101.     __asm__ __volatile__(
  102.     "ldrb    %0, [%2]\n"
  103. "    bic    %0, %0, %1\n"
  104. "    strb    %0, [%2]"
  105.     : "=&r" (temp)
  106.     : "r" (1 << (irq & 7)), "r" (ioaddr(IOMD_FIQMASK)));
  107. }
  108.  
  109. static void rpc_unmask_irq_fiq(unsigned int irq)
  110. {
  111.     unsigned int temp;
  112.  
  113.     __asm__ __volatile__(
  114.     "ldrb    %0, [%2]\n"
  115. "    orr    %0, %0, %1\n"
  116. "    strb    %0, [%2]"
  117.     : "=&r" (temp)
  118.     : "r" (1 << (irq & 7)), "r" (ioaddr(IOMD_FIQMASK)));
  119. }
  120.  
  121. static __inline__ void irq_init_irq(void)
  122. {
  123.     extern void ecard_disableirq(unsigned int irq);
  124.     extern void ecard_enableirq(unsigned int irq);
  125.     int irq;
  126.  
  127.     outb(0, IOMD_IRQMASKA);
  128.     outb(0, IOMD_IRQMASKB);
  129.     outb(0, IOMD_FIQMASK);
  130.     outb(0, IOMD_DMAMASK);
  131.  
  132.     for (irq = 0; irq < NR_IRQS; irq++) {
  133.         switch (irq) {
  134.         case 0 ... 6:
  135.             irq_desc[irq].probe_ok = 1;
  136.         case 7:
  137.             irq_desc[irq].valid    = 1;
  138.             irq_desc[irq].mask_ack = rpc_mask_irq_ack_a;
  139.             irq_desc[irq].mask     = rpc_mask_irq_a;
  140.             irq_desc[irq].unmask   = rpc_unmask_irq_a;
  141.             break;
  142.  
  143.         case 9 ... 15:
  144.             irq_desc[irq].probe_ok = 1;
  145.         case 8:
  146.             irq_desc[irq].valid    = 1;
  147.             irq_desc[irq].mask_ack = rpc_mask_irq_b;
  148.             irq_desc[irq].mask     = rpc_mask_irq_b;
  149.             irq_desc[irq].unmask   = rpc_unmask_irq_b;
  150.             break;
  151.  
  152.         case 16 ... 22:
  153.             irq_desc[irq].valid    = 1;
  154.             irq_desc[irq].mask_ack = rpc_mask_irq_dma;
  155.             irq_desc[irq].mask     = rpc_mask_irq_dma;
  156.             irq_desc[irq].unmask   = rpc_unmask_irq_dma;
  157.             break;
  158.  
  159.         case 32 ... 40:
  160.             irq_desc[irq].valid    = 1;
  161.             irq_desc[irq].mask_ack = ecard_disableirq;
  162.             irq_desc[irq].mask     = ecard_disableirq;
  163.             irq_desc[irq].unmask   = ecard_enableirq;
  164.             break;
  165.  
  166.         case 64 ... 72:
  167.             irq_desc[irq].valid    = 1;
  168.             irq_desc[irq].mask_ack = rpc_mask_irq_fiq;
  169.             irq_desc[irq].mask     = rpc_mask_irq_fiq;
  170.             irq_desc[irq].unmask   = rpc_unmask_irq_fiq;
  171.             break;
  172.         }
  173.     }
  174. }
  175.